package top.sqdpt.third.utils;

import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 负载均衡工具类
 */
public class LoadBalancerUtil {
    
    private static final Random RANDOM = ThreadLocalRandom.current();
    
    /**
     * 从列表中随机获取一个元素
     *
     * @param list 源列表
     * @param <T> 元素类型
     * @return 随机元素
     * @throws IllegalArgumentException 如果列表为空
     */
    public static <T> T random(List<T> list) {
        if (list == null || list.isEmpty()) {
            throw new IllegalArgumentException("列表不能为空");
        }
        return list.get(RANDOM.nextInt(list.size()));
    }
    
    /**
     * 从列表中随机获取一个元素，支持权重
     *
     * @param list 源列表
     * @param weightFunction 权重计算函数
     * @param <T> 元素类型
     * @return 随机元素
     * @throws IllegalArgumentException 如果列表为空
     */
    public static <T> T weightedRandom(List<T> list, WeightFunction<T> weightFunction) {
        if (list == null || list.isEmpty()) {
            throw new IllegalArgumentException("列表不能为空");
        }
        
        // 计算总权重
        double totalWeight = list.stream()
            .mapToDouble(weightFunction::getWeight)
            .sum();
            
        // 生成随机值
        double random = RANDOM.nextDouble() * totalWeight;
        
        // 根据权重选择元素
        double currentWeight = 0;
        for (T element : list) {
            currentWeight += weightFunction.getWeight(element);
            if (random <= currentWeight) {
                return element;
            }
        }
        
        // 兜底返回最后一个元素
        return list.get(list.size() - 1);
    }
    
    /**
     * 权重计算函数接口
     *
     * @param <T> 元素类型
     */
    @FunctionalInterface
    public interface WeightFunction<T> {
        /**
         * 获取元素权重
         *
         * @param element 元素
         * @return 权重值
         */
        double getWeight(T element);
    }
} 